#include<iostream>
using namespace std;

/*
给一个数组nums和一个值val，需要原地移除所有数值等于val的元素，并返回移除后数组的新长度。
不要使用额外的数组空间，你必须仅使用O(1)额外空间并原地修改输入数组。
元素的顺序可以改变,不需要考虑数组中超出新长度后面的元素。
*/

int removeVal(int*array,int len,int val){
	int flag=0;
	
	for(int i=0;i<len;i++){
		if(array[i]==val){
			for(int j=i+1;j<len;j++){
				array[j-1]=array[j];
			}
			i--;//相当于数组向前移动了一位
			len--;
		}
	}

	for(int i=0;i<len;i++){
		cout<<array[i]<<" ";
	}
	cout<<endl;
	return len;
}

int removeValFastAndSlowPtr(int*array,int len,int val){
	//快指针用于遍历数组，慢指针用于寻找目标值
	//快指针扫描到目标值后慢指针停止，直到快指针扫描到下一个非目标值再遍历
	//慢指针启动时直接赋值快指针的当前值，跳过中间的所有目标值
	int slowPtr=0;
	for(int fastPtr=0;fastPtr<len;fastPtr++){
		if(array[fastPtr]!=val){
			array[slowPtr++]=array[fastPtr];
		}
	}
	
	for(int i=0;i<slowPtr;i++){
		cout<<array[i]<<" ";
	}
	cout<<endl;
	return slowPtr;
}

int main(){
    //nums=[0,1,2,2,3,0,4,2],va =2,函数应该返回新的长度5,并且nums中的前五个元素为0, 1, 3, 0, 4。
	int array[8]={0,1,2,2,3,0,4,2};
    cout<<removeValFastAndSlowPtr(array,8,2)<<endl;
    return 0;
}